/**
 * 
 */
package ar.edu.utn.frgp.banco.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frgp.banco.dao.CuentaDao;
import ar.edu.utn.frgp.banco.dao.ServiciosDao;
import ar.edu.utn.frgp.banco.domain.PagoServicios;
import ar.edu.utn.frgp.banco.domain.Servicios;
import ar.edu.utn.frgp.banco.domain.enums.OrigenMovimiento;
import ar.edu.utn.frgp.banco.exceptions.DataAccessException;
import ar.edu.utn.frgp.banco.utils.Constantes;
import ar.edu.utn.frgp.banco.utils.Logger;

/**
 * @author PUSDERKIS
 *
 */
public class ServiciosDaoImpl extends GenericDaoImpl implements ServiciosDao {

	CuentaDao cuentaDao = new CuentasDaoImpl();
	
	/* (non-Javadoc)
	 * @see ar.edu.utn.frgp.banco.dao.ServiciosDao#obtenerServicios()
	 */
	@Override
	public List<Servicios> obtenerServicios() throws DataAccessException {
		
		Connection con = null;
		ResultSet rs = null;
		PreparedStatement st = null;
		
		List<Servicios> servicios = new ArrayList<Servicios>();
		String query = "SELECT ID_SERV, DESCRIPCION,MONTO_FIJO FROM SERVICIOS";
				
		try{
			con = getConection();
			
			st = con.prepareStatement(query.toString());
			
			rs = st.executeQuery();
			Servicios s;
			while (rs.next()){
				s = new Servicios();
				s.setId(rs.getString(1));
				s.setDescripcion(rs.getString(2));
				s.setMontoFijo(rs.getBigDecimal(3));
				servicios.add(s);
			}
			
			
		}catch (SQLException sql){
			throw new DataAccessException(Constantes.EXCEPCION_BD_GENERICA);
		} finally {
			closeResultSet(rs);
			closeStatement(st);
			closeConnection();
		}
		
		return servicios;
	}

	/* (non-Javadoc)
	 * @see ar.edu.utn.frgp.banco.dao.ServiciosDao#pagarServicio(ar.edu.utn.frgp.banco.domain.PagoServicios)
	 */
	@Override
	public void pagarServicio(PagoServicios pago) throws DataAccessException {
		
		Connection con = null;
		PreparedStatement st = null;
		StringBuffer query = new StringBuffer();
		query.append("INSERT INTO PAGO_SERVICIOS (")
		.append("ID_SERV,")
		.append("FECHA,")
		.append("NRO_CUENTA) ")
		.append("VALUES (?,?,?)");
		
		
		try {
			
			con = getConection();
			
			cuentaDao.setConnection(con);
			
			cuentaDao.extraccion(pago.getCuenta().getNumero(), pago.getServicio().getMontoFijo(), OrigenMovimiento.SERVICIO);
			
			st = con.prepareStatement(query.toString());
			
			st.setString(1, pago.getServicio().getId());
			java.sql.Date fecha = new java.sql.Date(new java.util.Date().getTime());
			st.setDate(2, fecha);
			st.setLong(3, pago.getCuenta().getNumero());
			
			st.executeUpdate();
			
			
		} catch (SQLException e) {
			Logger.error("Ocurrio un error en la clase "+this.getClass()+" - "+e.getMessage());
			throw new DataAccessException(Constantes.EXCEPCION_BD_GENERICA);
		} finally {
			closeStatement(st);
			closeConnection();
		}
		
		
	}

	@Override
	public Servicios obtenerServicio(String idServicio)
			throws DataAccessException {

		Connection con = null;
		ResultSet rs = null;
		PreparedStatement st = null;
		
		Servicios servicio = null;
		String query = "SELECT ID_SERV, DESCRIPCION,MONTO_FIJO FROM SERVICIOS where id_serv = ?";
				
		try{
			con = getConection();
			
			st = con.prepareStatement(query.toString());
			st.setString(1, idServicio);
			
			rs = st.executeQuery();
			
			
			while (rs.next()){
				servicio = new Servicios();
				servicio.setId(rs.getString(1));
				servicio.setDescripcion(rs.getString(2));
				servicio.setMontoFijo(rs.getBigDecimal(3));
			}
			
			
		}catch (SQLException sql){
			throw new DataAccessException(Constantes.EXCEPCION_BD_GENERICA);
		} finally {
			closeResultSet(rs);
			closeStatement(st);
			closeConnection();
		}
		
		return servicio;
	}

}
